home *** CD-ROM | disk | FTP | other *** search
- top version 2.00 eXtended Version
- changes by Harun Scheutzow, jerry geiger and Volker Seebode:
- version V2.00x24, 95/07/23
- Volker: rewrote code for switch table entires '.dc.w Lxxx-Lyyy'
- fixed bug in rewriting switch table labels
- added code to handle register parm functions if sizeof() type is unsigned long
- (new directive `size_t_long' from HCC pl 34)
- added function prototypes
-
- version V2.00x23, 95/06/25
- Volker: fixed register allocation bug. No more "lea ...,Dx"
- (lassign()/reg.c)
-
- version V2.00x22
- Volker: full support of A6 relative addressing of vars/parms
- and register restoring needed by functions manipulating the stack
- pointer, like alloca(). Activated in HCC by '#pragma OPT +FRM'
- or '-fframe-relative', passed to TOP with ';frm'. No link/unlk
- statement will be deleted.
- Versions: HCC >= V20x27 and TOP >= V20x22.
-
- version V2.00x21
- Volker: switch table entries '.dc.w Lxxx-Lyyy' for
- HCC >= V20x26 and JAS >= V20x10 (compile with -DLABELDIFF)
-
- version V2.00x20
- Volker: 'ccr' and 'sr' now handled as REG.
-
- version V2.00x19
- Volker: added handling of double (64-bit) return values.
-
- version V2.00x18
- Harun: peephole bug fix peephole routines changed (peep2.c)
-
- version V2.00x17
- Options switched off by commandline arguments cannot be reactivated
- with '#pragma OPT +<char>' statements.
-
- version V2.00x16
- '+u' bug should be fixed now. I hope so - jerry.
- Harun improved his peephole bug fix.
-
- version V2.00x15
- one known bug: sometimes it is better to make use of '-u' option,
- cause top calculates wrong offsets to (sp) after deleting
- link/unlink instructions sometimes
-
- Thu Jun 16 1994
- peephole bug;
- deleting of:
- move.l a3,a4
- move.l _alles,a3
- move.l a4,_alles
- with use of a3
- fixed. (Harun Scheutzow did this)
-
- Thu Jun 14 1994
- There was still a impossible 'moveq #VAL, dest' generated sometimes.
- error messages output changed, more diagnostics (switches in source)
- in verbose mode
-
- version 2.00x14
- Mon Mar 7 1994
- fixing bugs:
- No more 'moveq #VAL, Ax' is generated.
-
-
- Feb 19 1994
- version 2.00x13
- I tried to fix some bugs:
- No more 'lea ANY, Dx' is produced.
- An exception sometimes occured while testing a non existent bra condition.
- Fixed.
-
- Option -v and -V now work as you'ld expect:
- -v : verbose
- -V : print version info
-
-
- TOP, Version 2.00x9 ('x9' von uns zwecks Unterscheidbarkeit hinzugefügt)
- Stand: 26.08.92
-
- Kurzübersicht/Zusammenfassung der Änderungen am SOZOBON-Optimizer TOP,
- die von Christian Wempe und Holger Weets durchgeführt wurden:
-
- Zunächst die schlechte Nachricht:
- In der Original-Version 2.00 hatte sich außer der neuen Option '-g'
- praktisch so gut wie überhaupt nichts verändert. Alle Fehler waren
- noch drin, und es waren keinerlei neue Optimierungen enthalten.
- Somit tragen wir die Verantwortung für alle Fehler, die mit dem neuen
- Optimizer auftreten, und mit dem alten nicht. Natürlich können wir
- dafür in keiner Weise haftbar gemacht werden, die Benutzung erfolgt
- auf eigene Gefahr. Jeder Benutzer erkennt dies mit dem ersten Starten
- des Programmes an.
-
- Allgemeines
- -----------
- - alle uns bekannten Fehler konnten beseitigt werden
- - TOP wurde auf Geschwindigkeit und Länge optimiert
- - binäres statt lineares Suchen
- - Zeiger statt Arrays
- - intelligenteres ausführen der Register-Analyse
- - Zusammenfassen von Peephole changes
- - System-Nahes I/O - Handling
- - TOP läuft jetzt ohne Änderungen auf ATARI und Amiga
- - Die bereits eingebauten Optimierungen wurden wesentlich verbessert,
- und sehr viele neue hinzugefügt (siehe unten)
- - Die Zusammenarbeit mit dem Compiler (XCC) wurde verbessert.
- Dieser erzeugt einige neue Hinweise im Text, welche TOP für bessere
- Optimierung nutzt;
- Für Insider:
- ;loop Lx -- wird für loop rotations verwendet, Lx ist das
- Label, welches am Anfang der Schleifen-Bedingung
- steht
- ;ret (d|a)0 -- wird zum Löschen von überflüssigen Zeilen ver-
- wendet; das Argument (d0 oder a0) gibt dabei an,
- in welchem Register das Funktions-Ergebnis zurück-
- gegeben wird.
- Bisher hat TOP bei jeder Funktion angenommen, das
- sie ein Ergebnis in D0 zurückgibt, und demzufolge
- weniger Instruktionen gelöscht
- ;sstart
- ;send -- dient zum umsortieren von switches
- ;longs -- reicht die '-L' (int = long) Option an den TOP weiter
- ;notop -- schaltet die Optimierung für die aktuelle Funktion
- aus, es werden nur noch die Blöcke sortiert
- (praktisch zum debuggen!)
- ;xhcc -- nur wenn dies im Text steht, wird die ';ret' Direktive
- verwendet; somit läuft TOP jetzt auch mit anderen
- Versionen des SOZOBON-Compilers zusammen
- ;opt [options] -- hiermit können die Optionen des TOP funktionsweise
- ein- und ausgeschaltet werden, wobei '+<c>' die Option
- <c> einschaltet, und '-<c>' sie ausschaltet; diese
- Schalter können im C-Quelltext per '#pragma' in den
- Assembler-Text gebracht werden. Siehe dazu die Datei
- HCC.CHG
- ;debug [fkt] -- aktuell noch nicht verwendet, kommt später im Zu-
- sammenhang mit der Debug-Option des Compilers zum
- Tragen
-
- ;var ... -- im Original bereits enthalten, gibt Namen, Größe
- und Stack-Position einer lokalen Variablen an
- ;reg ... -- im Original bereits enthalten, gibt Namen und Register
- einer lokalen Variablen an
- ;rega ... -- gibt Namen, Größe und Stack-Position eines lokalen
- Zeigers an
-
- ACHTUNG: BEI EINGESCHALTETER -C OPTION UNSERE VERSION DER XDLIBS
- SOWIE UNSERE FLOAT-BIBLIOTHEK VERWENET WERDEN !!!
-
- Erweiterungen
- -------------
- - Loop rotations wurden implementiert. Hierbei handelt es sich um eine
- reine Geschwindigkeits-Optimierung, daß Programm wird dadurch weder
- kürzer noch länger.
- Nachtrag: unter Umständen kann es passieren, daß eine zusätzliche
- branch-Anweisung eingefügt werden muß, daß Programm könnte
- also doch etwas länger werden; am Besten ausprobieren.
- Abschaltbar wie bisher mit '-l'
-
- - Block-Optimierung wurde implementiert. Hierbei handelt es sich um eine
- reine Längen-Optimierung, daß Programm wird also nicht schneller, und
- wenn '-q' (siehe unten) aktiviert ist, auch nicht langsamer. Abschaltbar
- sind diese mit '-j' (j für 'join')
-
- - Mittels der Option '-q' erzeugt TOP schnelleren, ansonsten kürzeren
- Code. Bei manchen Optimierungen ist es nämlich so, daß sie das
- Programm wesentlich schneller, aber auch länger machen, und in diesen
- Fällen wird jetzt durch die Option entschieden, was zu tun ist
-
- - Es wurden viele neue peephole changes implementiert. Insbesondere kann
- TOP nun endlich auch ganze C-Anweisungen entfernen, wenn sie über-
- flüssig sind.
-
- - Das 'registerizing' wurde dahingehend verbessert, daß nun wenn möglich
- die Register d0-d2 und a0-a2 verwendet werden. Dies ist also eine reine
- Geschwindigkeits-Optimierung, da hierduch die movem-Anweisungen kürzer
- werden bzw ganz entfallen.
-
- - Es werden jetzt bei Bedarf auch Adress-Register verwendet, um lokale
- Variablen und Parameter aufzunehmen. Dies betrifft insbesondere auch
- lokale Arrays und Strukturen.
-
- - es wurden Peephole changes implementiert, welche auch über mehrere
- Blöcke hinweg arbeiten können, und dabei beliebig viele Instruktionen
- manipulieren (in der Ausgabe: 'peephole changes (X)')
-
- - wenn Schleifen rotiert werden, dann kann bei bestimmenten Schleifentypen
- noch mehr optimiert werden (in der Ausgabe: 'branches refixed')
-
- - wenn möglich, werden die link/unlk - Anweisungen entfernt. Da dies z.B.
- bei Verwendung der Funktion alloca() Probleme geben kann, ist dieses
- Feature abschaltbar mit '-u'.
-
- - bei Aufrufen der Bibliotheks-Funktionen
- strcmp() strcpy() strcat() strlen() strchr() strrchr()
- stricmp() strlwr() strupr() strrev() strpos() bzero()
- memcpy() lmemcpy() memmove() lmemmove() memccpy() memchr()
- memcmp() memicmp() memset() memswap() stradj() strcspn()
- stristr() strncat() strncmp() strncpy() strnicmp() strnset()
- strpbrk() strpcpy() strrpbrk() strrpos() strset() strspn()
- strstr() strtok() strtrim() substr() subnstr()
- basename() suffix()
- werden die Parameter in Registern übergeben (und nicht auf dem Stack).
- Gleiches gilt für die intern für 'long' Berechnungen verwendeten
- Funktionen
- lmul, lmulu, ldiv, ldivu, lrem, lremu
- und die intern für Floatingpoint-Berechnungen verwendeten Funktionen
- fpmul, fpdiv, fpadd, fpsub, fpcmp, fpneg, fpltof, fpftol
-
- Diese Form des Aufrufes ist
- - schneller und kürzer
- (Stack-Korrektur sowie das Laden der Parameter vom Stack entfällt)
- - läuft aber nur noch mit unserer Version der XDLibs
- - und abschaltbar mit '-c'
- ACHTUNG: Die oben aufgezählten Funktionen sind speziell für die Register-
- Parameter-Übergabe umgeschrieben worden, und sollten keinesfalls
- durch Eigenkonstruktionen ersetzt werden !!!!
- Bei den oben aufgeführten Funktionen wird seit V2.00x6 ein Parameter-
- Test durchgeführt. Der TOP warnt z.B. bei Anweisungen wie
- "strlwr(str1, str2);", weil die Funktion strlwr() mit nur einem Parameter
- aufgerufen wird.
-
- - Die Funktionen werden so umsortiert, daß a() vor b() steht, wenn a()
- von b() aufgerufen wird
- -> der Assembler kann mehr bsr.s statt jsr/bsr verwenden, was kürzer
- ist
- Dies ist abschaltbar mit '-f'
-
- - ATARI:
- Aufrufe von Funktionen, die in der selben Datei stehen, werden PC-
- relativ gemacht.
- AMIGA:
- Alle Funktions-Aufrufe werden PC-relativ gemacht.
- Dies ist abschaltbar mit '-a'.
-
- - damit es nicht so langweilig wird, zeigt TOP jetzt immer an, welche
- Funktion gerade optimiert wird
-
- - Mehrere Variablen k÷nnen sich jetzt ein Register teilen, dadurch k÷nnen
- eventuell noch mehr Variablen registert werden, wodurch der Code sowohl
- kⁿrzer als auch schneller wird. (in der Ausgabe: 'registers joined')
- Dies ist abschaltbar mit '-m' und ist nur eingeschaltet, wenn das
- Registerizing (-r) auch eingeschaltet ist.
-
- Bugs
- ----
- Aktuell sind uns keine Fehler des Optimizers bekannt, wegen der
- Komplexität des Optimierungs-Prozesses sind diese jedoch nie
- auszuschliessen.
- Wenn also Fehler gefunden werden, dann wie folgt vorgehen:
- 1. Programm ohne TOP übersetzen und prüfen, ob der Fehler nicht
- vielleicht trotzdem auftritt...
-
- 2. Nachsehen, ob in der fehlerhaften Datei der Inline-Assembler ver-
- wendet wurde ( asm() ); falls ja, liegt der Fehler aller Wahr-
- scheinlichkeit nach daran, daß dort Code erzeugt wurde, welcher
- den TOP irritiert:
- - '.dc' - Anweisungen im TEXT-Segment
- Abhilfe: die Daten ins DATA-Segment verfrachten (mit '.data')
- - Kommentare der Form, wie sie vom Compiler geschrieben werden (s.o.)
- Abhilfe: nach dem ';' ein Leerzeichen machen
- - diverse Code-Sequenzen, die der Compiler nie erzeugt
- Abhilfe: alle Funktionen, die den Inline-Assembler verwenden,
- in eine separate Datei verschieben, und diese ohne
- Optimizer übersetzen, oder die betreffenden Funktionen
- mit '#pragma +TOP' / '#pragma -TOP' klammern
-
- 3. die Datei, in der TOP den Fehler macht, vom Compiler übersetzen
- lassen
-
- 4. die so erhaltene Datei (*.S) auf eine Diskette kopieren
- (kopieren der *.C - Datei wäre hilfreich, aber nicht unbedingt
- erforderlich)
-
- 5. Alles aufschreiben, was zu dem Fehler bekannt ist
- - in welcher Funktion tritt er auf
- - welche Optionen des TOP müssen angegeben werden, damit der Fehler
- nicht mehr auftritt
- - zuerst die Peephole changes abschalten, danach funktioniert
- wahrscheinlich bereits alles wieder
- - falls der Fehler immer noch auftritt, jetzt die restlichen
- Optionen probieren.
- Soblald der Fehler nicht mehr auftritt, soviele Optimierungen wie
- möglich wieder einschalten (um die Optimierungs-Art einzugrenzen,
- an der es wirklich lag)
- - wie äußert sich der Fehler (Berechnung falsch, Bomben, etc)
-
- Christian & Holger
-
-
-
-
-
-
-
-
-